/*
 * author: Andriamananony, Meß, Falk
 */

package schedule;

import java.util.ArrayList;

import plan.Plan;
import auftrag.Auftrag;
import auftrag.Ressource;

public class EDF implements ISchedule {
	private int mMethod = 0;
	
	public Plan makePlan(ArrayList<?> pAuftragList, ArrayList<Ressource> pRessourceList, int pMethod) {
		mMethod = pMethod;
		return makePlan(pAuftragList, pRessourceList);
	}
	
	public Plan makePlan(ArrayList<?> pAuftragList, ArrayList<Ressource> pRessourceList) {
		// Plan der zurückgegeben wird

		// Aktueller Auftrag aus der unsortierten Liste
		ArrayList<Auftrag> arrSortAuftrag = sortAufträge(pAuftragList);
		return new SimplePlan().makePlan(arrSortAuftrag, pRessourceList, mMethod);
	}
	
	public ArrayList<Auftrag> sortAufträge(ArrayList<?> pAuftragList){
		Auftrag aufAuftrag;

		// Liste erstellen mit Aufträgen die nach Priorität und Deadline
		// sortiert sind
		ArrayList<Auftrag> arrSortAuftrag = new ArrayList<Auftrag>();

		// Gehe alle Aufträge durch die unsortierte Liste durch
		for (int intIndexa = 0; intIndexa < pAuftragList.size(); intIndexa++) {

			// Lese den Auftrag ein, der einsortiert werden soll
			aufAuftrag = (Auftrag) pAuftragList.get(intIndexa);

			// Wenn die sortierte Liste noch leer ist, dann füge den ersten
			// Auftrag als Referenz ein
			if (arrSortAuftrag.isEmpty()) {
				arrSortAuftrag.add(aufAuftrag);
			} else {
				// Gucke die sortierte Liste durch
				for (int intIndexb = 0; intIndexb < arrSortAuftrag.size(); intIndexb++) {
					// Vergleiche ob die Priorität des Auftrages kleiner als die
					// der einsortierten Aufträge ist
					if (aufAuftrag.getDeadline() < arrSortAuftrag
							.get(intIndexb).getDeadline()) {
						arrSortAuftrag.add(intIndexb, aufAuftrag);
						break;
					}
					// Wenn die Priorität gleich ist und die Deadline kleiner
					// dann füge den Auftrag auch davor
					else if (aufAuftrag.getDeadline() == arrSortAuftrag.get(
							intIndexb).getDeadline()
							&& aufAuftrag.getPriority() > arrSortAuftrag.get(
									intIndexb).getPriority()) {
						arrSortAuftrag.add(intIndexb, aufAuftrag);
						break;
					}
					// Wenn beide Fälle nicht eintreffen und er am Ende der
					// Liste angekommen ist, dann füge einfach den Auftrag ein
					else if((intIndexb+1) >= arrSortAuftrag.size() ){
						arrSortAuftrag.add(aufAuftrag);
						break;
					}
				}
			}
		}
		return arrSortAuftrag;
	}
}